﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using ClassLibraryEntidades;
using System.Configuration;
using System.Xml.Serialization;
using System.Collections;
using System.Globalization;
using ClassLibraryServer.Negocio;

namespace ConsoleApplicationTesterServer
{
    class Program
    {
        static localhost.Service proxy = new ConsoleApplicationTesterServer.localhost.Service();



        static void Main(string[] args)
        {


            proxy.Timeout = -1;

            //----------CREACIÓN DE TABLAS-------------------------
            //CrearTablaRutasBusquedas();
            //ObtenerTablaRutasBusqueda();
            //-----------------------------------------------------

            TestearConexion();
            TestearDameMapa();
            TestearBusquedaPorDireccion2();
            //ObtenerTablaRutasBusqueda();

            //Console.WriteLine(FormatearCalle(@"caLle C \  Cacá"));

                       

            Console.WriteLine("+++++++++++++FIN+++++++++++++++");
            Console.ReadLine();

        }

        #region Método de TESTEO1
        /// <summary>
        /// Testear un búsqueda
        /// </summary>
        private static void TestearBusquedaPorDireccion()
        {
            Direccion p1, p2;
            p1 = new Direccion("calle tejares", 1);
            p2 = new Direccion("calle del angel", 6);

            BusquedaNatural busquedaNatural = new BusquedaNatural(p1, p2);

            byte[] busquedaNatural_serializada = Serializador.SerializarObjeto(busquedaNatural);

            byte[] bytes_ruta_resultado = proxy.RealizarBusquedaPorDireccion(busquedaNatural_serializada);

            Ruta ruta = (Ruta)Serializador.DeserializarObjeto(bytes_ruta_resultado, typeof(Ruta));

            Console.WriteLine("La búsqueda se ha realizado correctamente y se ha recibido la RUTA");
            Console.WriteLine("La ruta tiene " + ruta.arcos.Count + " arcos");
        }

        private static void TestearConexion()
        {
            proxy.TestConexion();
            Console.WriteLine("La conexión está disponible");
        }

        private static void TestearDameMapa()
        {
            Coordenada coordenada = new Coordenada();
            byte[] coordenada_serializada = Serializador.SerializarObjeto(coordenada);

            byte[] bytes_mapa = proxy.DameMapa(coordenada_serializada);
            Mapa mapa = (Mapa)Serializador.DeserializarObjeto(bytes_mapa, typeof(Mapa));

            Console.WriteLine("TestearDameMapa correcto");

        }


        #endregion

        #region Metodos TESTEO2


        private static void TestearBusquedaPorDireccion2()
        {
            Direccion p1, p2;

            string calle_origen = Util.FormatearCalleSinQuitarAcentos("calle lepanto");
            string calle_destino = Util.FormatearCalleSinQuitarAcentos("c/ ciudad real");

            p1 = new Direccion(calle_origen, 1);
            p2 = new Direccion(calle_destino, 20);

            BusquedaNatural busquedaNatural = new BusquedaNatural(p1, p2);
            busquedaNatural.TipoRuta = Ruta.TiposRuta.Ecologica;

            byte[] busquedaNatural_serializada = Serializador.SerializarObjeto(busquedaNatural);

            byte[] bytes_ruta_resultado = proxy.RealizarBusquedaPorDireccion(busquedaNatural_serializada);

            Ruta ruta = (Ruta)Serializador.DeserializarObjeto(bytes_ruta_resultado, typeof(Ruta));

            Console.WriteLine("La búsqueda se ha realizado correctamente y se ha recibido la RUTA");
            Console.WriteLine("La ruta tiene " + ruta.arcos.Count + " arcos");

            Dictionary<Nodo, List<Arco>> d = new Dictionary<Nodo, List<Arco>>();
            
        }

        #endregion

        #region Métodos Utilidades


        private static void CrearTablaRutasBusquedas()
        {

            Dictionary<string, Ruta> dictionaryBusquedas = new Dictionary<string, Ruta>(100);

            //-------------------------------------------------------------------
            //-------------------AÑADIMOS NUEVA RUTA-----------------------------
            //-------------------------------------------------------------------

            //Creo las coordenadas de los diferentes nodos
            Coordenada c1 = new Coordenada(10, 50);
            Coordenada c2 = new Coordenada(40, 70);
            Coordenada c3 = new Coordenada(80, 100);
            Coordenada c4 = new Coordenada(80, 130);
            Coordenada c5 = new Coordenada(30, 170);

            //Creo las direcciones
            Direccion dir = new Direccion("a", 2);

            //Creo los nodos
            Nodo a = new Nodo(c1, dir);
            Nodo b = new Nodo(c2, dir);
            Nodo c = new Nodo(c3, dir);
            Nodo d = new Nodo(c4, dir);
            Nodo e = new Nodo(c5, dir);

            //Creo los arcos
            List<Arco> arcos = new List<Arco>(4);

            Arco ar1 = new Arco(a, b);
            Arco ar2 = new Arco(b, c);
            Arco ar3 = new Arco(c, d);
            Arco ar4 = new Arco(d, e);

            arcos.Add(ar1);
            arcos.Add(ar2);
            arcos.Add(ar3);
            arcos.Add(ar4);

            //Creo la ruta que devuelvo
            Ruta ruta1 = new Ruta("Ecologica",arcos);


            dictionaryBusquedas.Add("Ecologicatejares1angel5", ruta1);

            //-------------------------------------------------------------------
            //-------------------------------------------------------------------

            string path_fichero_searchers = proxy.FileSearchesServer();

            // Create file to save the data to
            FileStream fs = new FileStream(path_fichero_searchers, FileMode.Create);
            // Create a BinaryFormatter object to perform the serialization
            BinaryFormatter bf = new BinaryFormatter();
            // Use the BinaryFormatter object to serialize the data to the file
            bf.Serialize(fs, dictionaryBusquedas);
            // Close the file
            fs.Close();

            Console.WriteLine("Almacenamiento de las búsquedas correcta");

        }


        private static void ObtenerTablaRutasBusqueda()
        {
            string path_fichero_searchers = proxy.FileSearchesServer();
            
            // Create file to save the data to
            FileStream fs = new FileStream(path_fichero_searchers, FileMode.Open);
            // Create a BinaryFormatter object to perform the serialization
            BinaryFormatter bf = new BinaryFormatter();



            Dictionary<string, Ruta> diccionarioBusqueda = (Dictionary<string, Ruta>)bf.Deserialize(fs);
            fs.Close();

            //Ruta ruta1 = diccionarioBusqueda["tejares1angel5"];
            Ruta r = diccionarioBusqueda["Ecologicaluisbadia1lepanto20"];


            Console.WriteLine("Obtención de las búsquedas correcta");


        }

        

        #endregion
    }
}